package br.edu.unirn.main;

import java.util.Random;
import java.util.Scanner;

import br.edu.unirn.dao.HospedeDAO;
import br.edu.unirn.dao.HotelDAO;
import br.edu.unirn.dao.ReservaDAO;
import br.edu.unirn.model.Aposento;
import br.edu.unirn.model.Endereco;
import br.edu.unirn.model.Hospede;
import br.edu.unirn.model.Hotel;
import br.edu.unirn.model.Reserva;
import br.edu.unirn.model.Telefone;
import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class Principal {

	private static Hospede hospede;
	private static Scanner ler;

	public static void main(String[] args) throws Exception {

		boolean continua = true;
		ler = new Scanner(System.in);
		persistirValores();

		while (continua) {

			System.out.println("1 - Persistir Valores.");

			System.out.println("2 - Criteria findAllReservaByHospedeAndPreco.");
			System.out.println("3 - Criteria findReservaByPrecoTotal.");

			System.out.println("4 - JPQL findHospedeByIdadeMaior.");
			System.out.println("5 - JPQL findHospedeByIdadeBetweenMaxAndMin.");
			System.out.println("6 - JPQL findHospedeByNomeAndIdade.");
			System.out.println("7 - JPQL findHospedeByEnderecoIsEmpty.");

			System.out.println("0 - Finalizar.");

			int op = Integer.parseInt(ler.next());

			switch (op) {
			case 1:
				findHospedeByCpf();
				break;

			case 2:
				findAllReservaByHospedeAndPreco();
				break;

			case 3:
				findReservaByPrecoTotal();
				break;

			case 4:
				findHospedeByIdadeMaior();
				break;

			case 5:
				findHospedeByIdadeBetweenMaxAndMin();
				break;

			case 6:
				findHospedeByNomeAndIdade();
				break;

			case 7:
				findHospedeByEnderecoIsEmpty();
				break;

			case 0:
				continua = false;
				break;
			}
		}
	}

	// Recupera preco de todas as reservas
	public static void findAllReservaByHospedeAndPreco() {
		ReservaDAO reservaDAO = new ReservaDAO();

		for (Object[] registro : reservaDAO.findAllReservaByHospedeAndPreco()) {
			System.out.println(registro[0]);
			System.out.println("Preço:" + registro[1]);
		}
	}

	// Calcula o valor total das reservas
	public static void findReservaByPrecoTotal() {
		ReservaDAO reservaDAO = new ReservaDAO();

		System.out.println("Preço Total: "
				+ reservaDAO.findReservaByPrecoTotal());
	}

	// Recupera os hospedes com idades superior ao valor passado.
	public static void findHospedeByIdadeMaior() {
		HospedeDAO dao = new HospedeDAO();
		System.out.println("Digite a idade:");
		int idade = ler.nextInt();
		for (Hospede hospedes : dao.findHospedeByIdadeMaior(idade)) {
			System.out.println(hospedes.toString());
		}
	}

	// Recupera hospedes entre faixas de idades.
	public static void findHospedeByIdadeBetweenMaxAndMin() {
		HospedeDAO dao = new HospedeDAO();
		System.out.println("Digite a idade mínima:");
		int minimo = ler.nextInt();
		System.out.println("Digite a idade maxima:");
		int maximo = ler.nextInt();
		for (Hospede hospedes : dao.findHospedeByIdadeBetweenMaxAndMin(minimo,
				maximo)) {
			System.out.println(hospedes.toString());
		}
	}

	// Recupera os hospedes pelo nome e idade diferente.
	public static void findHospedeByNomeAndIdade() {
		HospedeDAO dao = new HospedeDAO();
		System.out.println("Digite o nome:");
		String nome = ler.next();
		System.out.println("Digite a idade:");
		int idade = ler.nextInt();
		for (Hospede hospedes : dao.findHospedeByNomeAndIdade(nome, idade)) {
			System.out.println(hospedes.toString());
		}
	}

	// Retorna os hospedes que não possuem endereço
	public static void findHospedeByEnderecoIsEmpty() {
		HospedeDAO dao = new HospedeDAO();
		for (Hospede hospedes : dao.findHospedeByEnderecoIsEmpty()) {
			System.out.println(hospedes.toString());
		}
	}

	// Retorna o Hospede pelo CPF
	public static void findHospedeByCpf() {
		HospedeDAO dao = new HospedeDAO();
		System.out.println("Digite o CPF:");
		Long cpf = ler.nextLong();

		Hospede h = (Hospede) dao.findByPrimaryKey(cpf);
		System.out.println(h.getNome());
	}

	// Classe principal que persista informações iniciais no projeto.
	public static void persistirValores() throws ParseException {
		Random gerador = new Random();
		SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");

		HospedeDAO hospedeDAO = new HospedeDAO();
		HotelDAO hotelDAO = new HotelDAO();
		ReservaDAO reservaDAO = new ReservaDAO();

		Endereco endereco;
		Telefone telefone;
		Reserva reserva;
		Hotel hotel;
		Aposento aposento;

		for (int i = 1; i < 8; i++) {
			// criando entidades
			hospede = new Hospede();
			endereco = new Endereco();
			telefone = new Telefone();
			reserva = new Reserva();
			hotel = new Hotel();
			aposento = new Aposento();

			if (i == 1) {
				// setando hospede
				hospede.setCpf(Long.parseLong("4503345470"));
				hospede.setNome("Romulo Fagundes");
				hospede.setIdade(31);

				// setando endereco
				endereco.setBairro("Cidade da Esperanca");
				endereco.setRua("Belo Monte N 09");
				hospede.setEndereco(endereco);

				// setando telefone
				telefone.setDdd(84);
				telefone.setNumero("88834857");
				hospede.getTelefones().add(telefone);

				// persistindo hospede
				hospedeDAO.create(hospede);

				// setando hotel e aposento
				hotel.setNome("Web One System");
				hotel.setStars(7);
				aposento.setTipoAposento("Instituto de Radigologia");
				hotel.getAposentos().add(aposento);

				// persistindo hotel
				hotelDAO.create(hotel);

				// setando reserva
				reserva.setHospede(hospede);
				reserva.setHotel(hotel);
				reserva.setAposento(aposento);
				reserva.setInicioReserva(sdf.parse("05/03/1983"));
				reserva.setFimReserva(sdf.parse("30/07/2012"));
				reserva.setPreco(BigDecimal.valueOf(gerador.nextDouble() * 100).setScale(2, BigDecimal.ROUND_UP));

				// persistindo reserva
				reservaDAO.create(reserva);
			} else {
				// setando hospede
				hospede.setCpf(Long.parseLong("95605084" + gerador.nextInt(300)));
				hospede.setNome("Hospede " + i);
				hospede.setIdade(gerador.nextInt(100));

				// setando endereco
				endereco.setBairro("Bairro " + i);
				endereco.setRua("Rua " + i);
				hospede.setEndereco(endereco);

				// setando telefone
				telefone.setDdd(gerador.nextInt(100) + i);
				telefone.setNumero(gerador.nextInt(100) + "-"
						+ gerador.nextInt(100));
				hospede.getTelefones().add(telefone);

				// persistindo hospede
				hospedeDAO.create(hospede);

				// setando hotel e aposento
				hotel.setNome("Hotel" + i);
				hotel.setStars(gerador.nextInt(8));
				aposento.setTipoAposento("Tipo " + i);
				hotel.getAposentos().add(aposento);

				// persistindo hotel
				hotelDAO.create(hotel);

				// setando reserva
				reserva.setHospede(hospede);
				reserva.setHotel(hotel);
				reserva.setAposento(aposento);
				reserva.setInicioReserva(new Date());
				reserva.setFimReserva(new Date());
				reserva.setPreco(BigDecimal.valueOf(gerador.nextDouble() * 100).setScale(2, BigDecimal.ROUND_UP));

				// persistindo reserva
				reservaDAO.create(reserva);
			}
		}
	}
}
